package br.com.sgmf.web.managedbean;

import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import br.com.sgmf.enums.Estado;
import br.com.sgmf.model.Endereco;
import br.com.sgmf.model.Funcao;
import br.com.sgmf.model.Motorista;
import br.com.sgmf.model.MotoristaVeiculo;
import br.com.sgmf.model.Setor;
import br.com.sgmf.model.Veiculo;
import br.com.sgmf.service.FuncaoService;
import br.com.sgmf.service.MotoristaService;
import br.com.sgmf.service.MotoristaVeiculoService;
import br.com.sgmf.service.SetorService;
import br.com.sgmf.service.VeiculoService;

@Component
@ManagedBean
@RequestScoped
public class MotoristaBean {

	private static final String MOTORISTA_SALVO_COM_SUCESSO = "Motorista cadastrado com sucesso!";
	private static final String MOTORISTA_EXCLUIDO_COM_SUCESSO = "Motorista excluído com sucesso!";
	private static final String ERRO_AO_SALVAR_MOTORISTA = "Erro ao salvar Motorista";
	private static final String ERRO_AO_EXCLUIR_MOTORISTA = "Erro ao excluir Motorista";

	private Motorista motorista;
	private Endereco endereco;
	private Veiculo veiculo;

	private Date entrada;
	private Date saida;

	private List<Motorista> motoristas;
	private List<Funcao> funcoes;
	private List<Setor> setores;
	private List<Veiculo> veiculos;

	private String placaVeiculo;

	@Autowired
	private MotoristaService motoristaService;

	@Autowired
	private FuncaoService funcaoService;

	@Autowired
	private SetorService setorService;

	@Autowired
	private VeiculoService veiculoService;

	@Autowired
	private MotoristaVeiculoService motoristaVeiculoService;

	@PostConstruct
	public void inicializar() {
		motorista = new Motorista();
		endereco = new Endereco();
		veiculo = new Veiculo();
		motoristas = motoristaService.findAll();
		veiculos = null;
		entrada = null;
		saida = null;
	}

	public String salvar() {
		FacesContext context = FacesContext.getCurrentInstance();
		FacesMessage message;

		try {
			motoristaService.saveOrUpdate(motorista, endereco);
			motoristaVeiculoService.save(new MotoristaVeiculo(
					motorista.getId(), veiculo.getId(), entrada, saida));
			message = new FacesMessage(FacesMessage.SEVERITY_INFO,
					MOTORISTA_SALVO_COM_SUCESSO, null);
			inicializar();
		} catch (Exception e) {
			message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
					ERRO_AO_SALVAR_MOTORISTA, null);
			e.printStackTrace();
		}

		context.addMessage(null, message);
		return null;
	}

	public void novo() {
		motorista = new Motorista();
		endereco = new Endereco();
		veiculo = new Veiculo();
		placaVeiculo = null;
		entrada = null;
		saida = null;
	}

	public String editar(Motorista motorista) {
		this.motorista = motorista;
		this.endereco = motorista.getEndereco();
		return null;
	}

	public String excluir(Motorista motorista) {
		FacesContext context = FacesContext.getCurrentInstance();
		FacesMessage message;

		try {
			motoristaService.delete(motorista);
			message = new FacesMessage(FacesMessage.SEVERITY_INFO,
					MOTORISTA_EXCLUIDO_COM_SUCESSO, null);
			inicializar();
		} catch (Exception e) {
			message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
					ERRO_AO_EXCLUIR_MOTORISTA, null);
			e.printStackTrace();
		}

		context.addMessage(null, message);
		return null;
	}

	public List<Veiculo> buscarVeiculo() {
		veiculos = veiculoService.findByPlaca(placaVeiculo);
		placaVeiculo = null;
		return veiculos;
	}

	public void adicionarVeiculo(Veiculo veiculo) {
		this.veiculo = veiculo;
	}

	public Estado[] getEstados() {
		return Estado.values();
	}

	public Date getEntrada() {
		return entrada;
	}

	public void setEntrada(Date entrada) {
		this.entrada = entrada;
	}

	public Date getSaida() {
		return saida;
	}

	public void setSaida(Date saida) {
		this.saida = saida;
	}

	public Motorista getMotorista() {
		return motorista;
	}

	public void setMotorista(Motorista motorista) {
		this.motorista = motorista;
	}

	public Endereco getEndereco() {
		return endereco;
	}

	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}

	public Veiculo getVeiculo() {
		return veiculo;
	}

	public void setVeiculo(Veiculo veiculo) {
		this.veiculo = veiculo;
	}

	public List<Motorista> getMotoristas() {
		return motoristas;
	}

	public void setMotoristas(List<Motorista> motoristas) {
		this.motoristas = motoristas;
	}

	public List<Funcao> getFuncoes() {
		return funcoes;
	}

	public void setFuncoes(List<Funcao> funcoes) {
		this.funcoes = funcoes;
	}

	public List<Setor> getSetores() {
		return setores;
	}

	public void setSetores(List<Setor> setores) {
		this.setores = setores;
	}

	public List<Veiculo> getVeiculos() {
		return veiculos;
	}

	public void setVeiculos(List<Veiculo> veiculos) {
		this.veiculos = veiculos;
	}

	public String getPlacaVeiculo() {
		return placaVeiculo;
	}

	public void setPlacaVeiculo(String placaVeiculo) {
		this.placaVeiculo = placaVeiculo;
	}

	public MotoristaService getMotoristaService() {
		return motoristaService;
	}

	public void setMotoristaService(MotoristaService motoristaService) {
		this.motoristaService = motoristaService;
	}

	public FuncaoService getFuncaoService() {
		return funcaoService;
	}

	public void setFuncaoService(FuncaoService funcaoService) {
		this.funcaoService = funcaoService;
	}

	public SetorService getSetorService() {
		return setorService;
	}

	public void setSetorService(SetorService setorService) {
		this.setorService = setorService;
	}

	public VeiculoService getVeiculoService() {
		return veiculoService;
	}

	public void setVeiculoService(VeiculoService veiculoService) {
		this.veiculoService = veiculoService;
	}

	public MotoristaVeiculoService getMotoristaVeiculoService() {
		return motoristaVeiculoService;
	}

	public void setMotoristaVeiculoService(
			MotoristaVeiculoService motoristaVeiculoService) {
		this.motoristaVeiculoService = motoristaVeiculoService;
	}

}
